﻿using FluentNHibernate.Mapping;
using ORM.NHibernateDemo.Models;
using System;

namespace ORM.NHibernateDemo.Mapping
{
    /// <summary>
    /// 基于Fluent映射
    /// </summary>
    public class PersonMap : ClassMap<Person>
    {
        /// <summary>
        /// 构造函数中指定具体映射
        /// </summary>
        public PersonMap()
        {
            //定义映射信息
            //定义表名
            Table("mdl_person");
            //指定其他的schema
            Schema("mdl_person_shcema");
            //默认指定为延迟加载
            Not.LazyLoad();//指定非延迟加载
            //指定ID列，即指定主键
            Id(x => x.ID)
                .Column("Person_ID")//指定ID列在数据库表中的列名
                .GeneratedBy.HiLo("100000")//指定自动生成
                .UnsavedValue(-1);//指定新对象持久化到数据库前的返回值
            //映射简单类型属性：int float double string bool byte datetime
            Map(x => x.Name)
                .Length(50)//指定最大长度
                .Nullable();//指定可空
            Map(x => x.Description);
            //映射枚举类型
            Map(x => x.Subject).CustomType<Enums.Subjects>();
            Map(x => x.IsOnSchool)
                .CustomType("YesNo")//
                .Default("false");
            Map(x => x.CreateTime).CustomType(typeof(DateTime)).Generated.Always();
            Map(x => x.Email);
            Map(x => x.Score);
            //引用映射 多对一关系
            References(x => x.Major)
                .ForeignKey("MajorID")//指定外键名 默认外键名[table]_Id
                .Not.Nullable();//指定非空
            //集合关系 一对多关系
            HasMany(x => x.Books)
                .Inverse()//指定后 首先持久化拥有集合的实体然后持久化集合中的实体
                .Cascade.AllDeleteOrphan();
            //映射多对多关系

        }
    }

    /// <summary>
    /// 基于Fluent映射
    /// </summary>
    public class MajorMap : ClassMap<Major>
    {
        public MajorMap()
        {
            Id(x => x.ID);
            Map(x => x.Name).Length(50).Nullable();
            Map(x => x.Description);
        }
    }

    public class BookMap : ClassMap<Book>
    {
        public BookMap()
        {
            Id(x => x.ID).GeneratedBy.HiLo("100000");
            Map(x => x.Name).Length(100).Not.Nullable();
            HasMany(x => x.Authors)
                .Table("BookAuthor");
            Component(x => x.Version);
        }
    }

    public class VersionMap : ComponentMap<Models.Version>
    {
        public VersionMap()
        {
            Map(x => x.VersionID).Not.Nullable().Length(100);
            Map(x => x.Major).Not.Nullable();
            Map(x => x.Minor).Not.Nullable();
            Map(x => x.Build).Not.Nullable();
            Map(x => x.Revision).Not.Nullable();
        }
    }
}